This report summarizes the results of an ongoing study focused on understanding the impact of the COVID-19 pandemic on Critical Care research. It includes data submitted by 126 centres between 2020-03-23 and 2020-07-14.
Participating centres
ICU location
map_world

| CAN |
37 |
| USA |
30 |
| AUS |
21 |
| FRA |
5 |
| NLD |
5 |
| NZL |
4 |
| ARG |
2 |
| GBR |
2 |
| IDN |
2 |
| ITA |
2 |
| MEX |
2 |
| SGP |
2 |
| THA |
2 |
| BRA |
1 |
| COL |
1 |
| DNK |
1 |
| ECU |
1 |
| IND |
1 |
| LBN |
1 |
| MYS |
1 |
| PAK |
1 |
| URY |
1 |
| VNM |
1 |
ICU population
dat_redcap %>%
select(record_id, site_pop) %>%
drop_na(site_pop) %>%
mutate(site_pop = recode(site_pop, "1" = "Adult", "2" = "Pediatric", "3" = "Mixed")) %>%
count(site_pop) %>%
mutate(perc = n.per(n, sum(n), 0),
label = paste(site_pop, "\n", perc, sep = "")
) %>%
mutate(order = row_number(),
fraction = n / sum(n),
label_pos = (cumsum(fraction) + c(0, head(cumsum(fraction), n = -1))) / 2) %>%
ggplot(aes(x = 2, y = fraction, fill = fct_reorder(label, rev(order)) )) +
geom_col(position = "fill", width = 1) +
geom_text(aes(label = label, y = label_pos, hjust = "outward"),
lineheight = 0.9, x = 2.75, size = 4) +
coord_polar("y", start = 0, clip = "off") +
scale_fill_brewer(palette = "Paired")+
scale_x_continuous(limits = c(0.05, 2.5))+
theme_void()+
theme(legend.position = "none")

Centre type
dat_redcap %>%
select(record_id, site_setting) %>%
drop_na(site_setting) %>%
mutate(site_setting = recode(site_setting, "1" = "Academic", "2" = "Community")) %>%
count(site_setting) %>%
mutate(perc = n.per(n, sum(n), 0),
label = paste(site_setting, "\n", perc, sep = "")
) %>%
mutate(order = row_number(),
fraction = n / sum(n),
label_pos = (cumsum(fraction) + c(0, head(cumsum(fraction), n = -1))) / 2) %>%
ggplot(aes(x = 2, y = fraction, fill = fct_reorder(label, rev(order)) )) +
geom_col(position = "fill", width = 1) +
geom_text(aes(label = label, y = label_pos, hjust = "outward"),
lineheight = 0.9, x = 2.75, size = 4) +
coord_polar("y", start = 0, clip = "off") +
scale_fill_brewer(palette = "Accent")+
scale_x_continuous(limits = c(0.05, 2.5))+
theme_void()+
theme(legend.position = "none")

Surveys per month
dat_redcap %>%
select(redcap_event_name) %>%
filter(redcap_event_name != "centre_info_arm_1") %>%
mutate(Month = case_when(
redcap_event_name == "202003_arm_1" ~ "March",
redcap_event_name == "202004_arm_1" ~ "April",
redcap_event_name == "202005_arm_1" ~ "May",
redcap_event_name == "202006_arm_1" ~ "June"
)) %>%
mutate(Month = fct_relevel(Month, c("March", "April", "May", "June"))) %>%
group_by(Month) %>%
drop_na() %>%
tally() %>%
select(Month, "Count" = n) %>%
kable()
| March |
107 |
| April |
104 |
| May |
101 |
| June |
91 |
# weekly_demo %>%
# kable()
COVID-19
Are there any patients in your hospital with CONFIRMED COVID-19? (n = 401 surveys)
ggplot(monthly_covid_hosp) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = covid_hosp),
colour = "white", size = 1) +
scale_fill_viridis_d(name = "") +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_covid_hosp$xcenter, labels = monthly_covid_hosp$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Are there any patients in your ICU with CONFIRMED COVID-19? (n = 401 surveys)
ggplot(monthly_covid_icu) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = covid_icu),
colour = "white", size = 1) +
scale_fill_viridis_d(name = "") +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_covid_icu$xcenter, labels = monthly_covid_icu$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Is your ICU currently enrolling patients in any COVID-19 specific studies? (n = 394 surveys)
ggplot(monthly_res_covid_any) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = res_covid_any),
colour = "white", size = 1) +
scale_fill_viridis_d(name = "") +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_res_covid_any$xcenter, labels = monthly_res_covid_any$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

What types of COVID-19 specific research studies are currently enrolling patients in your ICU? (n = 402 surveys) (Question added after start of the study)
dat_redcap %>%
filter(redcap_event_name %in% c("202003_arm_1", "202004_arm_1", "202005_arm_1", "202006_arm_1")) %>%
mutate(Month = recode(redcap_event_name,
"202003_arm_1" = "March 2020",
"202004_arm_1" = "April 2020",
"202005_arm_1" = "May 2020",
"202006_arm_1" = "June 2020"),
Month = fct_inorder(Month)) %>%
select(Month, "Randomized" = res_cov_type___1, "Non-randomized" = res_cov_type___2 , "Observational" = res_cov_type___3, "Other" = res_cov_type___4) %>%
mutate_at(c("Randomized", "Non-randomized", "Observational", "Other"), as.numeric) %>%
group_by(Month) %>%
summarise_at(c("Randomized", "Non-randomized", "Observational", "Other"),sum, na.rm= TRUE)%>%
kable(align = "c")
| March 2020 |
14 |
1 |
25 |
1 |
| April 2020 |
26 |
12 |
58 |
3 |
| May 2020 |
39 |
14 |
68 |
2 |
| June 2020 |
30 |
8 |
61 |
4 |
#This is the code I have trial but I am stuck here
#dat_redcap %>%
#filter(redcap_event_name != "centre_info_arm_1") %>%
#mutate(Month = recode(redcap_event_name,
#"202003_arm_1" = "March 2020",
#"202004_arm_1" = "April 2020",
#"202005_arm_1" = "May 2020",
#"202006_arm_1" = "June 2020"),
#Month = fct_inorder(Month)) %>%
#select(Month, record_id, "Randomized" = res_cov_type___1, "Non-randomized" = res_cov_type___2 , "Observational" = res_cov_type___3, "Other" = res_cov_type___4) %>%
#mutate_at(c("Randomized", "Non-randomized", "Observational", "Other"), as.numeric) %>%
#mutate("Site Count" = case_when(
#Randomized == 1 | `Non-randomized` == 1 | Observational == 1 | Other == 1 ~ 1,
#TRUE ~ 0
#)) %>%
#group_by(Month) %>%
#summarise_at(c("Randomized", "Non-randomized", "Observational", "Other", "Site Count"),sum, na.rm= TRUE)
#Comments
#dat_redcap %>%
#select(Other = res_cov_type_other) %>%
#drop_na(Other) %>%
#kable()
Is your ICU currently preparing for any COVID-19 specific studies? (Question added after start of the study)
ggplot(monthly_res_covid_any_prep) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = res_covid_any_prep),
colour = "white", size = 1) +
scale_fill_viridis_d(name = "") +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_res_covid_any_prep$xcenter, labels = monthly_res_covid_any_prep$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Institutional policies
Is your REB/IRB prioritizing approval or willing to expedite approval of COVID-19 protocols? (n = 402 surveys)
ggplot(monthly_covid_reb) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = covid_reb),
colour = "white", size = 2) +
scale_fill_manual(name = "", values = c("#F7977A", "#FFF79A", "#82CA9D"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_covid_reb$xcent, labels = monthly_covid_reb$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

# #require suspending enrolment in icu studies
# dat_redcap %>%
# filter(redcap_event_name %in% c("202003_arm_1", "202004_arm_1", "202005_arm_1", "202006_arm_1")) %>%
# mutate(Month = recode(redcap_event_name,
# "202003_arm_1" = "March 2020",
# "202004_arm_1" = "April 2020",
# "202005_arm_1" = "May 2020",
# "202006_arm_1" = "June 2020"),
# Month = fct_inorder(Month)) %>%
# select(Month, "Yes - All studies" = policy___1, "Yes - All non-COVID-19 studies" = policy___2 , "Yes - Some studies" = policy___3, "No" = policy___4, "Other" = policy___5) %>%
# mutate_at(c("Yes - All studies", "Yes - All non-COVID-19 studies", "Yes - Some studies", "Other"),
# as.numeric) %>%
# group_by(Month) %>%
# summarise_at(c("Yes - All studies", "Yes - All non-COVID-19 studies", "Yes - Some studies", "Other"),sum, na.rm= TRUE) %>%
# kable(align = "c")
#TABLE FOR THIS QUESTION
#Types of Studies that were affected?
#dat_redcap %>%
#select(Comments = policy_some_explain) %>%
#drop_na(Comments) %>%
#kable()
#Please explain the other requirements
#dat_redcap %>%
#select(Comments = policy_other) %>%
#drop_na(Comments) %>%
#kable()
Impact on research
Because of COVID-19 or preparation for it, has your ICU:
Suspended recruitment for any studies? (n = 402 surveys)
ggplot(monthly_effect_suspend) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_suspend),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_suspend$xcent, labels = monthly_effect_suspend$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#dat_redcap %>%
#select(Comments = effect_suspend_explain) %>%
#drop_na(Comments) %>%
#kable()
Modified recruitment for current studies? (n = 401 surveys)
ggplot(monthly_effect_modify) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_modify),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_modify$xcent, labels = monthly_effect_modify$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_modify_explain) %>%
#drop_na(Comments) %>%
#kable()
Delayed the initiation of new (non-COVID-19) studies? (n = 400 surveys)
ggplot(monthly_effect_delay) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_delay),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_delay$xcent, labels = monthly_effect_delay$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_delay_explain) %>%
#drop_na(Comments) %>%
#kable()
Enrolled MORE patients in studies because of increased patient volume? (n = 401 surveys)
ggplot(monthly_effect_more) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_more),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_more$xcent, labels = monthly_effect_more$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments ADD THIS BACK IN IF THERE ARE COMMENTS
#dat_redcap %>%
#select(Comments = effect_more_explain) %>%
#drop_na(Comments) %>%
#kable()
Enrolled FEWER patients in studies because of increased patient volume? (n = 400 surveys)
ggplot(monthly_effect_less) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_less),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_less$xcent, labels = monthly_effect_less$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_less_explain) %>%
#drop_na(Comments) %>%
#kable()
Changed the approach to co-enrollment in studies? (n = 400 surveys)
ggplot(monthly_effect_co) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_co),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_co$xcent, labels = monthly_effect_co$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_co_explain) %>%
#drop_na(Comments) %>%
#kable()
Changed or stopped collection of biologic samples? (n = 400 surveys)
ggplot(monthly_effect_bio) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_bio),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_bio$xcent, labels = monthly_effect_bio$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_bio_explain) %>%
#drop_na(Comments) %>%
#kable()
Other effects on studies in your ICU? (n = 388 surveys)
ggplot(monthly_effect_other_yn) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = effect_other_yn),
colour = "white", size = 1) +
scale_fill_manual(name = "", values = c("#82CA9D", "#FFF79A", "#F7977A"), guide = guide_legend(reverse = FALSE))+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_effect_other_yn$xcent, labels = monthly_effect_other_yn$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#Comments
#dat_redcap %>%
#select(Comments = effect_other) %>%
#drop_na(Comments) %>%
#kable()
Reasons for impact
Because of COVID-19 or preparation for it, how much of an effect have the following had on research in your ICU?
Research staff WITH a clinical background are needed to work clinically (n = 401 surveys)
ggplot(monthly_reason_clinwork) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_clinwork),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_clinwork$xcent, labels = monthly_reason_clinwork$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Research staff WITHOUT a clinical background are needed to help with hospital activities (n = 400 surveys)
ggplot(monthly_reason_work) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_work),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_work$xcent, labels = monthly_reason_work$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Investigators are needed to work clinically (n = 307 surveys) (Question added after start of the study)
ggplot(monthly_reason_clinwork_invest) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_clinwork_invest),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_clinwork_invest$xcent, labels = monthly_reason_clinwork_invest$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Research staff are concerned about their safety working during outbreak (n = 400 surveys)
ggplot(monthly_reason_safety) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_safety),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_safety$xcent, labels = monthly_reason_safety$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Your pediatric ICU is admitting (or planning to admit) adults (n = 185 surveys) (Question added after start of the study)
ggplot(monthly_reason_adults) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_adults),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_adults$xcent, labels = monthly_reason_adults$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic
Error in grid.Call.graphics(C_setviewport, vp, TRUE) :
non-finite location and/or size for viewport

Not enough research staff for increased number of COVID-19 studies (n = 396 surveys)
ggplot(monthly_reason_numstudies) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_numstudies),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_numstudies$xcent, labels = monthly_reason_numstudies$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Not enough research staff for increased number of eligible patients (n = 400 surveys)
ggplot(monthly_reason_numpts) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_numpts),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_numpts$xcent, labels = monthly_reason_numpts$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Infection control policies limiting research staff access to the ICU (n = 399 surveys)
ggplot(monthly_reason_accessicu) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_accessicu),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_accessicu$xcent, labels = monthly_reason_accessicu$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Infection control policies limiting research staff access to patients with confirmed or suspected COVID-19 (n = 400 surveys)
ggplot(monthly_reason_accesspt) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_accesspt),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_accesspt$xcent, labels = monthly_reason_accesspt$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Clinical staff are too busy to complete research-related tasks (n = 400 surveys)
ggplot(monthly_reason_clinworkload) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_clinworkload),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_clinworkload$xcent, labels = monthly_reason_clinworkload$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

Research facilities for processing or storage of biological samples are closed or have reduced capacity (n = 341 surveys) (Question added after start of the study)
ggplot(monthly_reason_lab) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_lab),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_lab$xcent, labels = monthly_reason_lab$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

COVID-19 specific research is prioritized over other research (n = 398 surveys)
ggplot(monthly_reason_priorities) +
geom_rect(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = reason_priorities),
colour = "white", size = 1) +
scale_fill_brewer(name = "", palette = "Blues", guide = guide_legend(reverse = TRUE),
direction = -1)+
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
expand = c(0, 0)) +
scale_x_continuous(breaks = monthly_reason_priorities$xcent, labels = monthly_reason_priorities$month,
expand = c(0, 0)) +
coord_fixed() +
theme_bw() +
theme_mosaic

#dat_redcap %>%
#select(Comments = reason_other) %>%
#drop_na(Comments) %>%
#kable()
To join this study
On behalf of the Canadian Critical Care Trials Group and Canadian Critical Care Research Coordinators group, we invite your site to participate in a short longitudinal survey of the effects of COVID-19 on critical care research.
Use this link to send us the name and email of the person who will complete the survey on behalf of your centre: http://bit.ly/3aNqo8Z
They’ll receive a separate email with the survey within 24 hours and will get:
1) A 3-question survey about your ICU
2) A short (<10 min) monthly survey about the impact of COVID-19 on research in your ICU
About this study
Background: As we prepare for and manage COVID-19 patients in our ICUs, we realize both the importance of studying this disease and our role as global leaders in critical care research. From our experiences with SARS and H1N1, we also know that COVID-19 may both enhance and constrain current critical care research projects.
Objectives: The aims of this study are to:
1. Characterize current research activities in ICUs
2. Describe the effects of COVID-19 (and preparations) on research in ICUs, specifically to: identify new research started due to COVID-19; describe any impact on existing research activities; and identify COVID-19 hospital or ICU policies affecting research.
Methods: If you agree for your site to participate, you or your delegate will receive:
• A link to a single, brief survey (3 questions) about your ICU
• A link to a short (<10 minutes) survey about the impact of COVID-19 on research in your ICU. It will be sent on the first of the month for the duration of the COVID-19 outbreak.
• A report summarizing the results after each monthly survey
Ethics and privacy: This study has been reviewed by the Hamilton Integrated Research Ethics Board. Participation is of course voluntary and submitting data implies your consent to participate . You can stop participating at any time and prior to analysis you can withdraw any data from your centre. We will not publish any site or personal identifying information without your express consent.
Thank you, and we welcome any suggestions for adapting and updating this survey as events in this pandemic unfold.
Mark Duffett, RPh PhD
Departments of Pediatrics and Health Research Methods, Evidence, and Impact, McMaster University, Hamilton, Canada. duffetmc@mcmaster.ca, @M_Duffett
Michelle Kho, PT PhD
School of Rehabilitation Science, McMaster University, Hamilton, Canada. khome@mcmaster.ca, @khome
LS0tCnRpdGxlOiAiSW1wYWN0IG9mIENPVklELTE5IG9uIGNyaXRpY2FsIGNhcmUgcmVzZWFyY2giCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKIyBsb2FkIHBhY2thZ2VzIChvdGhlciBwYWNrYWdlcyBsb2FkZWQgd2l0aCBzb3VyY2VkIGZpbGVzKQpsaWJyYXJ5KGtuaXRyKQoKIyAjIHNvdXJjZSBmaWxlcwojICMgc291cmNpbmcgbm90IHdvcmtpbmcuLi5wcm9ibGVtIHdpdGggd29ya2luZyBkaXJlY3RvcnkuIFNvIHJ1biBmaWxlcyBtYW51YWxseSBmb3Igbm93OiBSdW4gc291cmNpbmcgaW4gQ09WSUQtMTkgU3VydmV5IHJlcG9ydCAtIHNvdXJjaW5nIGZpbGVzLlIpCgojIHNldCBvcHRpb25zCm9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSkKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1UUlVFKQoKIyBsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBsaWJyYXJ5KFJDb2xvckJyZXdlcikKIyBsaWJyYXJ5KHNmKQojIGxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKIyBsaWJyYXJ5KHJuYXR1cmFsZWFydGhkYXRhKQojIGxpYnJhcnkocmdlb3MpCiMgbGlicmFyeSh0aW55dGV4KQojIGxpYnJhcnkobHVicmlkYXRlKQpgYGAKICAKVGhpcyByZXBvcnQgc3VtbWFyaXplcyB0aGUgcmVzdWx0cyBvZiBhbiBvbmdvaW5nIHN0dWR5IGZvY3VzZWQgb24gdW5kZXJzdGFuZGluZyB0aGUgaW1wYWN0IG9mIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBvbiBDcml0aWNhbCBDYXJlIHJlc2VhcmNoLiBJdCBpbmNsdWRlcyBkYXRhIHN1Ym1pdHRlZCBieSBgciBucm93KGRhdF9jZW50cmUpYCBjZW50cmVzIGJldHdlZW4gYHIgbWluKGRhdF9kYXRlJHJlc2VhcmNoX2ltcGFjdF90aW1lc3RhbXAsIG5hLnJtID0gVFJVRSkgYCBhbmQgYHIgbWF4KGRhdF9kYXRlJHJlc2VhcmNoX2ltcGFjdF90aW1lc3RhbXAsIG5hLnJtID0gVFJVRSlgLiAKCjwhLS0gVGFicyBub3Qgd29ya2luZyAtLT4KPCEtLW1ha2VzIHRhYnMgb3V0IG9mIHN1YmhlYWRpbmdzLS0+ICAKPCEtLSAjIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfSAgIC0tPgoKPCEtLXRhYiAxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAojIyBQYXJ0aWNpcGF0aW5nIGNlbnRyZXMgIAoqKiogIAojIyMgSUNVIGxvY2F0aW9uCmBgYHtyIGZpZy5mdWxsd2lkdGggPSBUUlVFfQptYXBfd29ybGQKYGBgCgpgYGB7ciBjb3VudHJpZXMsIGVjaG8gPSBGQUxTRX0KZGF0X2NlbnRyZSAlPiUgCiAgY291bnQoQ291bnRyeV9Db2RlXzMpICU+JSAKICBhcnJhbmdlKGRlc2MobikpICU+JSAKICBzZWxlY3QoQ291bnRyeSA9IENvdW50cnlfQ29kZV8zLCBJQ1VzID0gbikgJT4lIAogIGthYmxlKCkKYGBgCgoqKiogIAojIyMgSUNVIHBvcHVsYXRpb24gIApgYGB7cn0KZGF0X3JlZGNhcCAlPiUgCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZV9wb3ApICU+JSAKICBkcm9wX25hKHNpdGVfcG9wKSAlPiUgCiAgbXV0YXRlKHNpdGVfcG9wID0gcmVjb2RlKHNpdGVfcG9wLCAiMSIgPSAiQWR1bHQiLCAiMiIgPSAiUGVkaWF0cmljIiwgIjMiID0gIk1peGVkIikpICU+JSAKICAgIGNvdW50KHNpdGVfcG9wKSAlPiUgCiAgbXV0YXRlKHBlcmMgPSBuLnBlcihuLCBzdW0obiksIDApLAogICAgICAgICBsYWJlbCA9IHBhc3RlKHNpdGVfcG9wLCAiXG4iLCBwZXJjLCBzZXAgPSAiIikKICAgICAgICAgKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gcm93X251bWJlcigpLAogICAgICAgICBmcmFjdGlvbiA9IG4gLyBzdW0obiksCiAgICAgICAgIGxhYmVsX3BvcyA9IChjdW1zdW0oZnJhY3Rpb24pICsgYygwLCBoZWFkKGN1bXN1bShmcmFjdGlvbiksIG4gPSAtMSkpKSAvIDIpICU+JSAKZ2dwbG90KGFlcyh4ID0gMiwgeSA9IGZyYWN0aW9uLCBmaWxsID0gZmN0X3Jlb3JkZXIobGFiZWwsIHJldihvcmRlcikpICkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgd2lkdGggPSAxKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsLCB5ID0gbGFiZWxfcG9zLCBoanVzdCA9ICJvdXR3YXJkIiksIAogICAgICAgICAgICBsaW5laGVpZ2h0ID0gMC45LCB4ID0gMi43NSwgc2l6ZSA9IDQpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCwgY2xpcCA9ICJvZmYiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjA1LCAyLjUpKSsKICB0aGVtZV92b2lkKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCgoqKiogIAojIyMgQ2VudHJlIHR5cGUgIApgYGB7cn0KZGF0X3JlZGNhcCAlPiUgCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZV9zZXR0aW5nKSAlPiUgCiAgZHJvcF9uYShzaXRlX3NldHRpbmcpICU+JSAKICBtdXRhdGUoc2l0ZV9zZXR0aW5nID0gcmVjb2RlKHNpdGVfc2V0dGluZywgIjEiID0gIkFjYWRlbWljIiwgIjIiID0gIkNvbW11bml0eSIpKSAlPiUgCiAgICBjb3VudChzaXRlX3NldHRpbmcpICU+JSAKICBtdXRhdGUocGVyYyA9IG4ucGVyKG4sIHN1bShuKSwgMCksCiAgICAgICAgIGxhYmVsID0gcGFzdGUoc2l0ZV9zZXR0aW5nLCAiXG4iLCBwZXJjLCBzZXAgPSAiIikKICAgICAgICAgKSAlPiUgCiAgbXV0YXRlKG9yZGVyID0gcm93X251bWJlcigpLAogICAgICAgICBmcmFjdGlvbiA9IG4gLyBzdW0obiksCiAgICAgICAgIGxhYmVsX3BvcyA9IChjdW1zdW0oZnJhY3Rpb24pICsgYygwLCBoZWFkKGN1bXN1bShmcmFjdGlvbiksIG4gPSAtMSkpKSAvIDIpICU+JSAKZ2dwbG90KGFlcyh4ID0gMiwgeSA9IGZyYWN0aW9uLCBmaWxsID0gZmN0X3Jlb3JkZXIobGFiZWwsIHJldihvcmRlcikpICkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJmaWxsIiwgd2lkdGggPSAxKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsLCB5ID0gbGFiZWxfcG9zLCBoanVzdCA9ICJvdXR3YXJkIiksIAogICAgICAgICAgICBsaW5laGVpZ2h0ID0gMC45LCB4ID0gMi43NSwgc2l6ZSA9IDQpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0ID0gMCwgY2xpcCA9ICJvZmYiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJBY2NlbnQiKSsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLjA1LCAyLjUpKSsKICB0aGVtZV92b2lkKCkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKYGBgCiAKIAoqKioKIyMjIFN1cnZleXMgcGVyIG1vbnRoCgpgYGB7cn0KZGF0X3JlZGNhcCAlPiUKICBzZWxlY3QocmVkY2FwX2V2ZW50X25hbWUpICU+JQogIGZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2VudHJlX2luZm9fYXJtXzEiKSAlPiUKICBtdXRhdGUoTW9udGggPSBjYXNlX3doZW4oCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDAzX2FybV8xIiB+ICJNYXJjaCIsCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDA0X2FybV8xIiB+ICJBcHJpbCIsCiAgICByZWRjYXBfZXZlbnRfbmFtZSA9PSAiMjAyMDA1X2FybV8xIiB+ICJNYXkiLAogICAgcmVkY2FwX2V2ZW50X25hbWUgPT0gIjIwMjAwNl9hcm1fMSIgfiAiSnVuZSIKICApKSAlPiUKICBtdXRhdGUoTW9udGggPSBmY3RfcmVsZXZlbChNb250aCwgYygiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiKSkpICU+JQogIGdyb3VwX2J5KE1vbnRoKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgdGFsbHkoKSAlPiUKICBzZWxlY3QoTW9udGgsICJDb3VudCIgPSBuKSAlPiUKICBrYWJsZSgpCmBgYAogICAKICAgIApgYGB7cn0KIyB3ZWVrbHlfZGVtbyAlPiUgIAojICAga2FibGUoKQpgYGAKICAKPCEtLXRhYiAzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAoqKiogIAojIyBDT1ZJRC0xOSAgCgoqKioKKipBcmUgdGhlcmUgYW55IHBhdGllbnRzIGluIHlvdXIgaG9zcGl0YWwgd2l0aCBDT05GSVJNRUQgQ09WSUQtMTk/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkY292aWRfaG9zcCkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIn0KZ2dwbG90KG1vbnRobHlfY292aWRfaG9zcCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBjb3ZpZF9ob3NwKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QobmFtZSA9ICIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2NvdmlkX2hvc3AkeGNlbnRlciwgbGFiZWxzID0gbW9udGhseV9jb3ZpZF9ob3NwJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKkFyZSB0aGVyZSBhbnkgcGF0aWVudHMgaW4geW91ciBJQ1Ugd2l0aCBDT05GSVJNRUQgQ09WSUQtMTk/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkY292aWRfaG9zcCkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIn0KZ2dwbG90KG1vbnRobHlfY292aWRfaWN1KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGNvdmlkX2ljdSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9jb3ZpZF9pY3UkeGNlbnRlciwgbGFiZWxzID0gbW9udGhseV9jb3ZpZF9pY3UkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoqKioKKipJcyB5b3VyIElDVSBjdXJyZW50bHkgZW5yb2xsaW5nIHBhdGllbnRzIGluIGFueSBDT1ZJRC0xOSBzcGVjaWZpYyBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlc19jb3ZpZF9hbnkpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3Jlc19jb3ZpZF9hbnkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVzX2NvdmlkX2FueSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG5hbWUgPSAiIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9yZXNfY292aWRfYW55JHhjZW50ZXIsIGxhYmVscyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqV2hhdCB0eXBlcyBvZiBDT1ZJRC0xOSBzcGVjaWZpYyByZXNlYXJjaCBzdHVkaWVzIGFyZSBjdXJyZW50bHkgZW5yb2xsaW5nIHBhdGllbnRzIGluIHlvdXIgSUNVPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGNvdmlkX3JlYikpYCBzdXJ2ZXlzKSAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KSAKCmBgYHtyfQpkYXRfcmVkY2FwICU+JSAKICBmaWx0ZXIocmVkY2FwX2V2ZW50X25hbWUgJWluJSBjKCIyMDIwMDNfYXJtXzEiLCAiMjAyMDA0X2FybV8xIiwgIjIwMjAwNV9hcm1fMSIsICIyMDIwMDZfYXJtXzEiKSkgJT4lCiAgbXV0YXRlKE1vbnRoID0gcmVjb2RlKHJlZGNhcF9ldmVudF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwM19hcm1fMSIgPSAiTWFyY2ggMjAyMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAiMjAyMDA0X2FybV8xIiA9ICJBcHJpbCAyMDIwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDVfYXJtXzEiID0gIk1heSAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwNl9hcm1fMSIgPSAiSnVuZSAyMDIwIiksCiAgICAgICAgIE1vbnRoID0gZmN0X2lub3JkZXIoTW9udGgpKSAlPiUKICBzZWxlY3QoTW9udGgsICJSYW5kb21pemVkIiA9IHJlc19jb3ZfdHlwZV9fXzEsICJOb24tcmFuZG9taXplZCIgPSByZXNfY292X3R5cGVfX18yICwgIk9ic2VydmF0aW9uYWwiID0gcmVzX2Nvdl90eXBlX19fMywgIk90aGVyIiA9IHJlc19jb3ZfdHlwZV9fXzQpICU+JQogIG11dGF0ZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSwgYXMubnVtZXJpYykgJT4lCiAgZ3JvdXBfYnkoTW9udGgpICU+JQogIHN1bW1hcmlzZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSxzdW0sIG5hLnJtPSBUUlVFKSU+JQogIGthYmxlKGFsaWduID0gImMiKQoKI1RoaXMgaXMgdGhlIGNvZGUgSSBoYXZlIHRyaWFsIGJ1dCBJIGFtIHN0dWNrIGhlcmUKI2RhdF9yZWRjYXAgJT4lIAogI2ZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2VudHJlX2luZm9fYXJtXzEiKSAlPiUKICAjbXV0YXRlKE1vbnRoID0gcmVjb2RlKHJlZGNhcF9ldmVudF9uYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDNfYXJtXzEiID0gIk1hcmNoIDIwMjAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDRfYXJtXzEiID0gIkFwcmlsIDIwMjAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDVfYXJtXzEiID0gIk1heSAyMDIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgIyIyMDIwMDZfYXJtXzEiID0gIkp1bmUgMjAyMCIpLAogICAgICAgICNNb250aCA9IGZjdF9pbm9yZGVyKE1vbnRoKSkgJT4lCiAgI3NlbGVjdChNb250aCwgcmVjb3JkX2lkLCAgIlJhbmRvbWl6ZWQiID0gcmVzX2Nvdl90eXBlX19fMSwgIk5vbi1yYW5kb21pemVkIiA9IHJlc19jb3ZfdHlwZV9fXzIgLCAiT2JzZXJ2YXRpb25hbCIgPSByZXNfY292X3R5cGVfX18zLCAiT3RoZXIiID0gcmVzX2Nvdl90eXBlX19fNCkgJT4lCiAgI211dGF0ZV9hdChjKCJSYW5kb21pemVkIiwgIk5vbi1yYW5kb21pemVkIiwgIk9ic2VydmF0aW9uYWwiLCAiT3RoZXIiKSwgYXMubnVtZXJpYykgJT4lCiAgI211dGF0ZSgiU2l0ZSBDb3VudCIgPSBjYXNlX3doZW4oCiAgICAjUmFuZG9taXplZCA9PSAxIHwgYE5vbi1yYW5kb21pemVkYCA9PSAxIHwgT2JzZXJ2YXRpb25hbCA9PSAxIHwgT3RoZXIgPT0gMSB+IDEsCiAgICAjVFJVRSB+IDAKICAjKSkgJT4lCiAgI2dyb3VwX2J5KE1vbnRoKSAlPiUKICAjc3VtbWFyaXNlX2F0KGMoIlJhbmRvbWl6ZWQiLCAiTm9uLXJhbmRvbWl6ZWQiLCAiT2JzZXJ2YXRpb25hbCIsICJPdGhlciIsICJTaXRlIENvdW50Iiksc3VtLCBuYS5ybT0gVFJVRSkKCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoT3RoZXIgPSByZXNfY292X3R5cGVfb3RoZXIpICU+JSAKICAjZHJvcF9uYShPdGhlcikgJT4lIAogICNrYWJsZSgpCmBgYAoqKioKKipJcyB5b3VyIElDVSBjdXJyZW50bHkgcHJlcGFyaW5nIGZvciBhbnkgQ09WSUQtMTkgc3BlY2lmaWMgc3R1ZGllcz8qKiAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KCmdncGxvdChtb250aGx5X3Jlc19jb3ZpZF9hbnlfcHJlcCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZXNfY292aWRfYW55X3ByZXApLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChuYW1lID0gIiIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueV9wcmVwJHhjZW50ZXIsIGxhYmVscyA9IG1vbnRobHlfcmVzX2NvdmlkX2FueV9wcmVwJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCgo8IS0tdGFiIDYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgCiMjIEluc3RpdHV0aW9uYWwgcG9saWNpZXMgCgoqKioKKipJcyB5b3VyIFJFQi9JUkIgcHJpb3JpdGl6aW5nIGFwcHJvdmFsIG9yIHdpbGxpbmcgdG8gZXhwZWRpdGUgYXBwcm92YWwgb2YgQ09WSUQtMTkgcHJvdG9jb2xzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGNvdmlkX3JlYikpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KZ2dwbG90KG1vbnRobHlfY292aWRfcmViKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGNvdmlkX3JlYiksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiI0Y3OTc3QSIsICIjRkZGNzlBIiwgIiM4MkNBOUQiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9jb3ZpZF9yZWIkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfY292aWRfcmViJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCgoKKioqCjwhLS0gKipEb2VzIHlvdXIgaW5zdGl0dXRpb24gY3VycmVudGx5IHJlcXVpcmUgc3VzcGVuZGluZyBlbnJvbG1lbnQgaW4gSUNVIHN0dWRpZXM/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcG9saWN5KSlgKSAoUXVlc3Rpb24gYWRkZWQgYWZ0ZXIgc3RhcnQgb2YgdGhlIHN0dWR5KSAtLT4KCmBgYHtyIGZpZy5oZWlnaHQ9MiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CgojICNyZXF1aXJlIHN1c3BlbmRpbmcgZW5yb2xtZW50IGluIGljdSBzdHVkaWVzCiMgZGF0X3JlZGNhcCAlPiUgCiMgICBmaWx0ZXIocmVkY2FwX2V2ZW50X25hbWUgJWluJSBjKCIyMDIwMDNfYXJtXzEiLCAiMjAyMDA0X2FybV8xIiwgIjIwMjAwNV9hcm1fMSIsICIyMDIwMDZfYXJtXzEiKSkgJT4lCiMgICBtdXRhdGUoTW9udGggPSByZWNvZGUocmVkY2FwX2V2ZW50X25hbWUsIAojICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDNfYXJtXzEiID0gIk1hcmNoIDIwMjAiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMDA0X2FybV8xIiA9ICJBcHJpbCAyMDIwIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjAwNV9hcm1fMSIgPSAiTWF5IDIwMjAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIwMDZfYXJtXzEiID0gIkp1bmUgMjAyMCIpLAojICAgICAgICAgIE1vbnRoID0gZmN0X2lub3JkZXIoTW9udGgpKSAlPiUKIyAgIHNlbGVjdChNb250aCwgIlllcyAtIEFsbCBzdHVkaWVzIiA9IHBvbGljeV9fXzEsICJZZXMgLSBBbGwgbm9uLUNPVklELTE5IHN0dWRpZXMiID0gcG9saWN5X19fMiAsICJZZXMgLSBTb21lIHN0dWRpZXMiID0gcG9saWN5X19fMywgIk5vIiA9IHBvbGljeV9fXzQsICJPdGhlciIgPSBwb2xpY3lfX181KSAlPiUKIyAgIG11dGF0ZV9hdChjKCJZZXMgLSBBbGwgc3R1ZGllcyIsICJZZXMgLSBBbGwgbm9uLUNPVklELTE5IHN0dWRpZXMiLCAiWWVzIC0gU29tZSBzdHVkaWVzIiwgIk90aGVyIiksIAojICAgICAgICAgICAgIGFzLm51bWVyaWMpICU+JQojICAgZ3JvdXBfYnkoTW9udGgpICU+JQojICAgc3VtbWFyaXNlX2F0KGMoIlllcyAtIEFsbCBzdHVkaWVzIiwgIlllcyAtIEFsbCBub24tQ09WSUQtMTkgc3R1ZGllcyIsICJZZXMgLSBTb21lIHN0dWRpZXMiLCAiT3RoZXIiKSxzdW0sIG5hLnJtPSBUUlVFKSAlPiUKIyAgIGthYmxlKGFsaWduID0gImMiKQoKI1RBQkxFIEZPUiBUSElTIFFVRVNUSU9OCgojVHlwZXMgb2YgU3R1ZGllcyB0aGF0IHdlcmUgYWZmZWN0ZWQ/CiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcG9saWN5X3NvbWVfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCiNQbGVhc2UgZXhwbGFpbiB0aGUgb3RoZXIgcmVxdWlyZW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcG9saWN5X290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoqKiogICAgIAo8IS0tdGFiIDQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgCiMjIEltcGFjdCBvbiByZXNlYXJjaCAgCioqKgoKKipCZWNhdXNlIG9mIENPVklELTE5IG9yIHByZXBhcmF0aW9uIGZvciBpdCwgaGFzIHlvdXIgSUNVOioqICAKCioqU3VzcGVuZGVkIHJlY3J1aXRtZW50IGZvciBhbnkgc3R1ZGllcz8qKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRlZmZlY3Rfc3VzcGVuZCkpYCBzdXJ2ZXlzKQpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQifQpnZ3Bsb3QobW9udGhseV9lZmZlY3Rfc3VzcGVuZCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3Rfc3VzcGVuZCksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3Rfc3VzcGVuZCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3Rfc3VzcGVuZCRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X3N1c3BlbmRfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoqKioKKipNb2RpZmllZCByZWNydWl0bWVudCBmb3IgY3VycmVudCBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9tb2RpZnkpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9tb2RpZnkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X21vZGlmeSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfbW9kaWZ5JHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9tb2RpZnkkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgoKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X21vZGlmeV9leHBsYWluKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCioqKgoqKkRlbGF5ZWQgdGhlIGluaXRpYXRpb24gb2YgbmV3IChub24tQ09WSUQtMTkpIHN0dWRpZXM/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkZWZmZWN0X2RlbGF5KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobW9udGhseV9lZmZlY3RfZGVsYXkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X2RlbGF5KSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCIjODJDQTlEIiwgIiNGRkY3OUEiLCAiI0Y3OTc3QSIpLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gRkFMU0UpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2VmZmVjdF9kZWxheSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3RfZGVsYXkkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoQ29tbWVudHMgPSBlZmZlY3RfZGVsYXlfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoKKioqCioqRW5yb2xsZWQgTU9SRSBwYXRpZW50cyBpbiBzdHVkaWVzIGJlY2F1c2Ugb2YgaW5jcmVhc2VkIHBhdGllbnQgdm9sdW1lPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9tb3JlKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobW9udGhseV9lZmZlY3RfbW9yZSkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3RfbW9yZSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfbW9yZSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9lZmZlY3RfbW9yZSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNDb21tZW50cyBBREQgVEhJUyBCQUNLIElOIElGIFRIRVJFIEFSRSBDT01NRU5UUwojZGF0X3JlZGNhcCAlPiUKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X21vcmVfZXhwbGFpbikgJT4lCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JQogICNrYWJsZSgpCgpgYGAKCioqKgoqKkVucm9sbGVkIEZFV0VSIHBhdGllbnRzIGluIHN0dWRpZXMgYmVjYXVzZSBvZiBpbmNyZWFzZWQgcGF0aWVudCB2b2x1bWU/KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkZWZmZWN0X2xlc3MpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9sZXNzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IGVmZmVjdF9sZXNzKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICIiLCB2YWx1ZXMgPSBjKCIjODJDQTlEIiwgIiNGRkY3OUEiLCAiI0Y3OTc3QSIpLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gRkFMU0UpKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X2VmZmVjdF9sZXNzJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9sZXNzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X2xlc3NfZXhwbGFpbikgJT4lIAogICNkcm9wX25hKENvbW1lbnRzKSAlPiUgCiAgI2thYmxlKCkKCmBgYAoKKioqCioqQ2hhbmdlZCB0aGUgYXBwcm9hY2ggdG8gY28tZW5yb2xsbWVudCBpbiBzdHVkaWVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9jbykpYCBzdXJ2ZXlzKQkKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X2VmZmVjdF9jbykgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3RfY28pLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIiM4MkNBOUQiLCAiI0ZGRjc5QSIsICIjRjc5NzdBIiksIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBGQUxTRSkpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfZWZmZWN0X2NvJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9jbyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNDb21tZW50cwojZGF0X3JlZGNhcCAlPiUgCiAgI3NlbGVjdChDb21tZW50cyA9IGVmZmVjdF9jb19leHBsYWluKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoqKioKKipDaGFuZ2VkIG9yIHN0b3BwZWQgY29sbGVjdGlvbiBvZiBiaW9sb2dpYyBzYW1wbGVzPyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJGVmZmVjdF9iaW8pKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X2VmZmVjdF9iaW8pICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gZWZmZWN0X2JpbyksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiIiwgdmFsdWVzID0gYygiIzgyQ0E5RCIsICIjRkZGNzlBIiwgIiNGNzk3N0EiKSwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IEZBTFNFKSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9lZmZlY3RfYmlvJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9iaW8kbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCgojQ29tbWVudHMKI2RhdF9yZWRjYXAgJT4lIAogICNzZWxlY3QoQ29tbWVudHMgPSBlZmZlY3RfYmlvX2V4cGxhaW4pICU+JSAKICAjZHJvcF9uYShDb21tZW50cykgJT4lIAogICNrYWJsZSgpCgpgYGAKCioqKgoqKk90aGVyIGVmZmVjdHMgb24gc3R1ZGllcyBpbiB5b3VyIElDVT8qKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRlZmZlY3Rfb3RoZXJfeW4pKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X2VmZmVjdF9vdGhlcl95bikgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBlZmZlY3Rfb3RoZXJfeW4pLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIiIsIHZhbHVlcyA9IGMoIiM4MkNBOUQiLCAiI0ZGRjc5QSIsICIjRjc5NzdBIiksIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBGQUxTRSkpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfZWZmZWN0X290aGVyX3luJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X2VmZmVjdF9vdGhlcl95biRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKI0NvbW1lbnRzCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gZWZmZWN0X290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCiAgCiAKPCEtLXRhYiA1LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIAoqKiogIAojIyBSZWFzb25zIGZvciBpbXBhY3QgICAgCgoqKioKKipCZWNhdXNlIG9mIENPVklELTE5IG9yIHByZXBhcmF0aW9uIGZvciBpdCwgaG93IG11Y2ggb2YgYW4gZWZmZWN0IGhhdmUgdGhlIGZvbGxvd2luZyBoYWQgb24gcmVzZWFyY2ggaW4geW91ciBJQ1U/KioKCioqUmVzZWFyY2ggc3RhZmYgV0lUSCBhIGNsaW5pY2FsIGJhY2tncm91bmQgYXJlIG5lZWRlZCB0byB3b3JrIGNsaW5pY2FsbHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmspKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYuNSwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KCmdncGxvdChtb250aGx5X3JlYXNvbl9jbGlud29yaykgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZWFzb25fY2xpbndvcmspLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9jbGlud29yayR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fY2xpbndvcmskbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoKKioqCioqUmVzZWFyY2ggc3RhZmYgV0lUSE9VVCBhIGNsaW5pY2FsIGJhY2tncm91bmQgYXJlIG5lZWRlZCB0byBoZWxwIHdpdGggaG9zcGl0YWwgYWN0aXZpdGllcyoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlYXNvbl93b3JrKSlgIHN1cnZleXMpICAKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Ni41LCByZXN1bHRzID0gImhvbGQiLCB3YXJuaW5nPUZBTFNFfQoKZ2dwbG90KG1vbnRobHlfcmVhc29uX3dvcmspICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX3dvcmspLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl93b3JrJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X3JlYXNvbl93b3JrJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKYGBgCioqKgoqKkludmVzdGlnYXRvcnMgYXJlIG5lZWRlZCB0byB3b3JrIGNsaW5pY2FsbHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmtfaW52ZXN0KSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fY2xpbndvcmtfaW52ZXN0KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9jbGlud29ya19pbnZlc3QpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9jbGlud29ya19pbnZlc3QkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2NsaW53b3JrX2ludmVzdCRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqUmVzZWFyY2ggc3RhZmYgYXJlIGNvbmNlcm5lZCBhYm91dCB0aGVpciBzYWZldHkgd29ya2luZyBkdXJpbmcgb3V0YnJlYWsqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fc2FmZXR5KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9zYWZldHkpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX3NhZmV0eSksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX3NhZmV0eSR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fc2FmZXR5JG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwoKYGBgCioqKgoqKllvdXIgcGVkaWF0cmljIElDVSBpcyBhZG1pdHRpbmcgKG9yIHBsYW5uaW5nIHRvIGFkbWl0KSBhZHVsdHMqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fYWR1bHRzKSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fYWR1bHRzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9hZHVsdHMpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hZHVsdHMkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2FkdWx0cyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqTm90IGVub3VnaCByZXNlYXJjaCBzdGFmZiBmb3IgaW5jcmVhc2VkIG51bWJlciBvZiBDT1ZJRC0xOSBzdHVkaWVzKiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX251bXN0dWRpZXMpKWAgc3VydmV5cykKCmBgYHtyIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTYuNSwgcmVzdWx0cyA9ICJob2xkIiwgd2FybmluZz1GQUxTRX0KZ2dwbG90KG1vbnRobHlfcmVhc29uX251bXN0dWRpZXMpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX251bXN0dWRpZXMpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9udW1zdHVkaWVzJHhjZW50LCBsYWJlbHMgPSBtb250aGx5X3JlYXNvbl9udW1zdHVkaWVzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKk5vdCBlbm91Z2ggcmVzZWFyY2ggc3RhZmYgZm9yIGluY3JlYXNlZCBudW1iZXIgb2YgZWxpZ2libGUgcGF0aWVudHMqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fbnVtcHRzKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X3JlYXNvbl9udW1wdHMpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX251bXB0cyksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX251bXB0cyR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fbnVtcHRzJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKkluZmVjdGlvbiBjb250cm9sIHBvbGljaWVzIGxpbWl0aW5nIHJlc2VhcmNoIHN0YWZmIGFjY2VzcyB0byB0aGUgSUNVKiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX2FjY2Vzc2ljdSkpYCBzdXJ2ZXlzKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Ni41LCByZXN1bHRzID0gImhvbGQifQpnZ3Bsb3QobW9udGhseV9yZWFzb25fYWNjZXNzaWN1KSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9hY2Nlc3NpY3UpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hY2Nlc3NpY3UkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2FjY2Vzc2ljdSRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKYGBgCgoqKioKKipJbmZlY3Rpb24gY29udHJvbCBwb2xpY2llcyBsaW1pdGluZyByZXNlYXJjaCBzdGFmZiBhY2Nlc3MgdG8gcGF0aWVudHMgd2l0aCBjb25maXJtZWQgb3Igc3VzcGVjdGVkIENPVklELTE5KiogKG4gPSBgciBzdW0oIWlzLm5hKGRhdF9yZWRjYXAkcmVhc29uX2FjY2Vzc3B0KSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9hY2Nlc3NwdCkgKwogIGdlb21fcmVjdChhZXMoeG1pbiA9IHhtaW4sIHhtYXggPSB4bWF4LCB5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSByZWFzb25fYWNjZXNzcHQpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9hY2Nlc3NwdCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fYWNjZXNzcHQkbW9udGgsCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsgCiAgdGhlbWVfbW9zYWljCmBgYAoKKioqCioqQ2xpbmljYWwgc3RhZmYgYXJlIHRvbyBidXN5IHRvIGNvbXBsZXRlIHJlc2VhcmNoLXJlbGF0ZWQgdGFza3MqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fY2xpbndvcmtsb2FkKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CmdncGxvdChtb250aGx5X3JlYXNvbl9jbGlud29ya2xvYWQpICsKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB4bWluLCB4bWF4ID0geG1heCwgeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gcmVhc29uX2NsaW53b3JrbG9hZCksIAogICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWUgPSAiIiwgcGFsZXR0ZSA9ICJCbHVlcyIsIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEpKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IG1vbnRobHlfcmVhc29uX2NsaW53b3JrbG9hZCR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fY2xpbndvcmtsb2FkJG1vbnRoLAogICAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfZml4ZWQoKSArCiAgdGhlbWVfYncoKSArIAogIHRoZW1lX21vc2FpYwpgYGAKCioqKgoqKlJlc2VhcmNoIGZhY2lsaXRpZXMgZm9yIHByb2Nlc3Npbmcgb3Igc3RvcmFnZSBvZiBiaW9sb2dpY2FsIHNhbXBsZXMgYXJlIGNsb3NlZCBvciBoYXZlIHJlZHVjZWQgY2FwYWNpdHkqKiAobiA9IGByIHN1bSghaXMubmEoZGF0X3JlZGNhcCRyZWFzb25fbGFiKSlgIHN1cnZleXMpIChRdWVzdGlvbiBhZGRlZCBhZnRlciBzdGFydCBvZiB0aGUgc3R1ZHkpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCJ9CgpnZ3Bsb3QobW9udGhseV9yZWFzb25fbGFiKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9sYWIpLCAKICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDEpICsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lID0gIiIsIHBhbGV0dGUgPSAiQmx1ZXMiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpLCAKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBtb250aGx5X3JlYXNvbl9sYWIkeGNlbnQsIGxhYmVscyA9IG1vbnRobHlfcmVhc29uX2xhYiRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCmBgYAoKKioqCioqQ09WSUQtMTkgc3BlY2lmaWMgcmVzZWFyY2ggaXMgcHJpb3JpdGl6ZWQgb3ZlciBvdGhlciByZXNlYXJjaCoqIChuID0gYHIgc3VtKCFpcy5uYShkYXRfcmVkY2FwJHJlYXNvbl9wcmlvcml0aWVzKSlgIHN1cnZleXMpCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LjUsIHJlc3VsdHMgPSAiaG9sZCIsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChtb250aGx5X3JlYXNvbl9wcmlvcml0aWVzKSArCiAgZ2VvbV9yZWN0KGFlcyh4bWluID0geG1pbiwgeG1heCA9IHhtYXgsIHltaW4gPSB5bWluLCB5bWF4ID0geW1heCwgZmlsbCA9IHJlYXNvbl9wcmlvcml0aWVzKSwgCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIHNpemUgPSAxKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICIiLCBwYWxldHRlID0gIkJsdWVzIiwgZ3VpZGUgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbW9udGhseV9yZWFzb25fcHJpb3JpdGllcyR4Y2VudCwgbGFiZWxzID0gbW9udGhseV9yZWFzb25fcHJpb3JpdGllcyRtb250aCwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHRoZW1lX2J3KCkgKyAKICB0aGVtZV9tb3NhaWMKCiNkYXRfcmVkY2FwICU+JSAKICAjc2VsZWN0KENvbW1lbnRzID0gcmVhc29uX290aGVyKSAlPiUgCiAgI2Ryb3BfbmEoQ29tbWVudHMpICU+JSAKICAja2FibGUoKQoKYGBgCgoKCjwhLS10YWIgNy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+ICAKIyMgVG8gam9pbiB0aGlzIHN0dWR5IAoqKiogIApPbiBiZWhhbGYgb2YgdGhlIENhbmFkaWFuIENyaXRpY2FsIENhcmUgVHJpYWxzIEdyb3VwIGFuZCBDYW5hZGlhbiBDcml0aWNhbCBDYXJlIFJlc2VhcmNoIENvb3JkaW5hdG9ycyBncm91cCwgd2UgaW52aXRlIHlvdXIgc2l0ZSB0byBwYXJ0aWNpcGF0ZSBpbiBhIHNob3J0IGxvbmdpdHVkaW5hbCBzdXJ2ZXkgb2YgdGhlIGVmZmVjdHMgb2YgQ09WSUQtMTkgb24gY3JpdGljYWwgY2FyZSByZXNlYXJjaC4gCgoKVXNlIHRoaXMgbGluayB0byBzZW5kIHVzIHRoZSBuYW1lIGFuZCBlbWFpbCBvZiB0aGUgcGVyc29uIHdobyB3aWxsIGNvbXBsZXRlIHRoZSBzdXJ2ZXkgb24gYmVoYWxmIG9mIHlvdXIgY2VudHJlOiAgaHR0cDovL2JpdC5seS8zYU5xbzhaICAKVGhleeKAmWxsIHJlY2VpdmUgYSBzZXBhcmF0ZSBlbWFpbCB3aXRoIHRoZSBzdXJ2ZXkgd2l0aGluIDI0IGhvdXJzIGFuZCB3aWxsIGdldDogIAoxKSBBIDMtcXVlc3Rpb24gc3VydmV5IGFib3V0IHlvdXIgSUNVICAKMikgQSBzaG9ydCAoPDEwIG1pbikgbW9udGhseSBzdXJ2ZXkgYWJvdXQgdGhlIGltcGFjdCBvZiBDT1ZJRC0xOSBvbiByZXNlYXJjaCBpbiB5b3VyIElDVSAgCgoqKiogIAojIyBBYm91dCB0aGlzIHN0dWR5CgoqKkJhY2tncm91bmQ6KiogQXMgd2UgcHJlcGFyZSBmb3IgYW5kIG1hbmFnZSBDT1ZJRC0xOSBwYXRpZW50cyBpbiBvdXIgSUNVcywgd2UgcmVhbGl6ZSBib3RoIHRoZSBpbXBvcnRhbmNlIG9mIHN0dWR5aW5nIHRoaXMgZGlzZWFzZSBhbmQgb3VyIHJvbGUgYXMgZ2xvYmFsIGxlYWRlcnMgaW4gY3JpdGljYWwgY2FyZSByZXNlYXJjaC4gIEZyb20gb3VyIGV4cGVyaWVuY2VzIHdpdGggU0FSUyBhbmQgSDFOMSwgd2UgYWxzbyBrbm93IHRoYXQgQ09WSUQtMTkgbWF5IGJvdGggZW5oYW5jZSBhbmQgY29uc3RyYWluIGN1cnJlbnQgY3JpdGljYWwgY2FyZSByZXNlYXJjaCBwcm9qZWN0cy4gIAogIAoqKk9iamVjdGl2ZXM6KiogVGhlIGFpbXMgb2YgdGhpcyBzdHVkeSBhcmUgdG86ICAKMS4gQ2hhcmFjdGVyaXplIGN1cnJlbnQgcmVzZWFyY2ggYWN0aXZpdGllcyBpbiBJQ1VzICAKMi4gRGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgQ09WSUQtMTkgKGFuZCBwcmVwYXJhdGlvbnMpIG9uIHJlc2VhcmNoIGluIElDVXMsIHNwZWNpZmljYWxseSB0bzogaWRlbnRpZnkgbmV3IHJlc2VhcmNoIHN0YXJ0ZWQgZHVlIHRvIENPVklELTE5OyBkZXNjcmliZSBhbnkgaW1wYWN0IG9uIGV4aXN0aW5nIHJlc2VhcmNoIGFjdGl2aXRpZXM7IGFuZCBpZGVudGlmeSBDT1ZJRC0xOSBob3NwaXRhbCBvciBJQ1UgcG9saWNpZXMgYWZmZWN0aW5nIHJlc2VhcmNoLiAKICAKKipNZXRob2RzOioqIElmIHlvdSBhZ3JlZSBmb3IgeW91ciBzaXRlIHRvIHBhcnRpY2lwYXRlLCB5b3Ugb3IgeW91ciBkZWxlZ2F0ZSB3aWxsIHJlY2VpdmU6ICAK4oCiCUEgbGluayB0byBhIHNpbmdsZSwgYnJpZWYgc3VydmV5ICgzIHF1ZXN0aW9ucykgYWJvdXQgeW91ciBJQ1UgIArigKIJQSBsaW5rIHRvIGEgc2hvcnQgKDwxMCBtaW51dGVzKSBzdXJ2ZXkgYWJvdXQgdGhlIGltcGFjdCBvZiBDT1ZJRC0xOSBvbiByZXNlYXJjaCBpbiB5b3VyIElDVS4gSXQgd2lsbCBiZSBzZW50IG9uIHRoZSBmaXJzdCBvZiB0aGUgbW9udGggZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgQ09WSUQtMTkgb3V0YnJlYWsuICAK4oCiCUEgcmVwb3J0IHN1bW1hcml6aW5nIHRoZSByZXN1bHRzIGFmdGVyIGVhY2ggbW9udGhseSBzdXJ2ZXkgIAoKKipFdGhpY3MgYW5kIHByaXZhY3k6KiogVGhpcyBzdHVkeSBoYXMgYmVlbiByZXZpZXdlZCBieSB0aGUgSGFtaWx0b24gSW50ZWdyYXRlZCBSZXNlYXJjaCBFdGhpY3MgQm9hcmQuIFBhcnRpY2lwYXRpb24gaXMgb2YgY291cnNlIHZvbHVudGFyeSBhbmQgc3VibWl0dGluZyBkYXRhIGltcGxpZXMgeW91ciBjb25zZW50IHRvIHBhcnRpY2lwYXRlIC4gWW91IGNhbiBzdG9wIHBhcnRpY2lwYXRpbmcgYXQgYW55IHRpbWUgYW5kIHByaW9yIHRvIGFuYWx5c2lzIHlvdSBjYW4gd2l0aGRyYXcgYW55IGRhdGEgZnJvbSB5b3VyIGNlbnRyZS4gV2Ugd2lsbCBub3QgcHVibGlzaCBhbnkgc2l0ZSBvciBwZXJzb25hbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiB3aXRob3V0IHlvdXIgZXhwcmVzcyBjb25zZW50LiAgCiAgClRoYW5rIHlvdSwgYW5kIHdlIHdlbGNvbWUgYW55IHN1Z2dlc3Rpb25zIGZvciBhZGFwdGluZyBhbmQgdXBkYXRpbmcgdGhpcyBzdXJ2ZXkgYXMgZXZlbnRzIGluIHRoaXMgcGFuZGVtaWMgdW5mb2xkLiAgCiAKKipNYXJrIER1ZmZldHQqKiwgUlBoIFBoRCAgCkRlcGFydG1lbnRzIG9mIFBlZGlhdHJpY3MgYW5kIEhlYWx0aCBSZXNlYXJjaCBNZXRob2RzLCBFdmlkZW5jZSwgYW5kIEltcGFjdCwgTWNNYXN0ZXIgVW5pdmVyc2l0eSwgSGFtaWx0b24sIENhbmFkYS4gZHVmZmV0bWNAbWNtYXN0ZXIuY2EsIEBbTV9EdWZmZXR0XShodHRwOi8vdHdpdHRlci5jb20vTV9EdWZmZXR0KSAgCiAKKipNaWNoZWxsZSBLaG8qKiwgUFQgUGhEICAKU2Nob29sIG9mIFJlaGFiaWxpdGF0aW9uIFNjaWVuY2UsIE1jTWFzdGVyIFVuaXZlcnNpdHksIEhhbWlsdG9uLCBDYW5hZGEuIGtob21lQG1jbWFzdGVyLmNhLCBAW2tob21lXShodHRwOi8vdHdpdHRlci5jb20va2hvbWUpICAKCiAKCg==